{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ERNIE Bot 搜索能力\n",
    "\n",
    "搜索能力在大模型中扮演着关键的角色，它能够借助搜索引擎，让模型可以获得实时信息，从而更全面地理解问题，做出更准确的预测和决策。\n",
    "\n",
    "现在，ERNIE Bot 和 ERNIE Bot 4.0 都已经支持了搜索能力，这一功能默认开启，无需额外设置模型即可返回更为准确的结果。\n",
    "\n",
    "注意：需要 SDK 版本 >= 0.1.4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "os.environ[\"QIANFAN_AK\"] = \"your_ak\"\n",
    "os.environ[\"QIANFAN_SK\"] = \"your_sk\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [03-01 19:01:56] openapi_requestor.py:316 [t:8423316288]: requesting llm api endpoint: /chat/completions_pro\n",
      "[INFO] [03-01 19:01:56] oauth.py:207 [t:8423316288]: trying to refresh access_token for ak `cY5Und***`\n",
      "[INFO] [03-01 19:01:56] oauth.py:220 [t:8423316288]: sucessfully refresh access_token\n"
     ]
    }
   ],
   "source": [
    "import qianfan\n",
    "\n",
    "# 为了更佳的展示效果，这里我们先定义一个展示 Markdown 的函数\n",
    "from IPython.display import Markdown, display\n",
    "\n",
    "def print_md(text):\n",
    "    display(Markdown(text))\n",
    "\n",
    "r = qianfan.ChatCompletion(model=\"ERNIE-Bot-4\").do(messages=[{\n",
    "    \"role\":\"user\",\n",
    "    \"content\": \"林俊杰2023演唱会安排\"\n",
    "}])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/markdown": [
       "林俊杰2023年的演唱会安排包括多个城市的巡演，具体时间和地点如下：\n",
       "\n",
       "* 上海站：8月19-20日，地点为上海虹口足球场。\n",
       "* 广州站：9月8-10日，地点为广州天河体育中心体育场。\n",
       "* 北京站：9月23-24日，地点待定。\n",
       "* 西安站：10月28-29日，地点为西安奥体中心体育场。\n",
       "* 南京站：11月11-12日，地点为南京奥体中心体育场。\n",
       "* 武汉站：11月25-26日，地点为武汉五环体育中心体育场。\n",
       "* 南宁站：12月9-10日，地点为广西体育中心主体育场。\n",
       "\n",
       "以上为林俊杰2023年部分演唱会的安排，仅供参考，具体以官方发布的信息为准。同时，门票价格可能会有所不同，建议查询官方票务网站以获取最新和最准确的信息。在购票时，请确保选择正规渠道，以避免遭受欺诈或购买到假票。\n",
       "\n",
       "此外，观看演唱会时，请务必注意个人财物和安全，遵守现场秩序和规定。如需了解更多关于林俊杰演唱会的信息，可以关注其官方社交媒体账号或相关新闻报道。"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print_md(r['result'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 引用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了更好的展现搜索结果的准确性，我们可以开启引用，这样模型的输出会通过角标展示所引用的搜索结果，方便用户寻找相关信息并甄别信息准确性。\n",
    "\n",
    "而开启引用，我们只需要在调用模型时，传入参数 `enable_citation` 即可。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [03-01 19:02:20] openapi_requestor.py:316 [t:8423316288]: requesting llm api endpoint: /chat/completions_pro\n"
     ]
    }
   ],
   "source": [
    "r = qianfan.ChatCompletion(model=\"ERNIE-Bot-4\").do(messages=[{\n",
    "    \"role\":\"user\",\n",
    "    \"content\": \"新能源汽车的优势\"\n",
    "}], enable_citation=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这样我们就可以在模型输出中看到角标，在 `['search_info']['search_results']` 字段中，我们可以拿到每个角标所引用的网址链接、标题等信息。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/markdown": [
       "新能源汽车的优势如下：\n",
       "\n",
       "* **环保** 。新能源汽车采用非化石燃料作为动力来源，不排放污染大气的有害气体^[1][2]^。\n",
       "* **节能** 。由于采用非化石燃料，新能源汽车的能耗比传统汽车低很多，能量利用率高^[1][2]^。\n",
       "* **噪音低** 。新能源汽车采用电动机，行驶时噪音很小，提高了驾驶的舒适性^[2]^。\n",
       "* **经济效益** 。新能源汽车的使用可以节省燃油费用，并且维护成本相对较低^[2]^。\n",
       "* **技术创新** 。新能源汽车的发展推动了技术创新和产业升级，为汽车产业的发展注入了新的活力^[2]^。\n",
       "\n",
       "此外，新能源汽车还有政策支持，如购车补贴、税收优惠等，这些政策可以降低用户购买新能源车的成本，从而促进新能源车的普及和应用^[1]^。"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "[1] [新能源车的优势在哪里](https://baijiahao.baidu.com/s?id=1781086471708716446&wfr=spider&for=pc)"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "[2] [新能源车的优势有哪些](https://baijiahao.baidu.com/s?id=1784414442224329540&wfr=spider&for=pc)"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print_md(r['result'])\n",
    "\n",
    "# 打印 Markdown 格式的链接\n",
    "for item in r['search_info']['search_results']:\n",
    "    print_md(\"[{}] [{}]({})\".format(item['index'], item['title'], item['url']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 关闭搜索能力"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在特殊的场景下，可能会希望关闭模型的搜索功能，可以通过传入参数 `disable_search` 实现。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [03-01 19:03:37] openapi_requestor.py:316 [t:8423316288]: requesting llm api endpoint: /chat/completions_pro\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "截至当前时间，我暂未了解到林俊杰2023年演唱会的全部具体安排。但根据通常的演唱会策划和推广流程，林俊杰的演唱会安排会在确定后通过官方渠道进行公布，包括他的官方网站、社交媒体平台以及合作的票务网站等。\n",
      "\n",
      "如果您对林俊杰的演唱会感兴趣，建议您关注他的官方社交媒体账号或订阅相关的票务信息，以便在第一时间获取最新的演唱会安排和购票信息。此外，也可以通过搜索引擎或相关的音乐新闻网站获取更多的演唱会相关资讯。\n",
      "\n",
      "请注意，由于疫情或其他不可控因素，演唱会的时间和地点可能会有所调整，因此建议您在购票前仔细确认演出信息。\n"
     ]
    }
   ],
   "source": [
    "r = qianfan.ChatCompletion(model=\"ERNIE-Bot-4\").do(messages=[{\n",
    "    \"role\":\"user\",\n",
    "    \"content\": \"林俊杰2023演唱会安排\"\n",
    "}], disable_search=True)\n",
    "print(r[\"result\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "⚠️注意！此时模型将无法获取实时信息，仅能根据训练数据进行判断，因此涉及实时的最新信息输出结果可能会不准确，请注意甄别！"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ERNIE-Bot-turbo开启搜索："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-23T09:04:27.446671Z",
     "start_time": "2024-02-23T09:04:23.401623Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO] [03-01 19:03:01] openapi_requestor.py:316 [t:8423316288]: requesting llm api endpoint: /chat/eb-instant\n"
     ]
    },
    {
     "data": {
      "text/markdown": [
       "**2024年的法定假日列表包括元旦、春节、清明节、劳动节、端午节和中秋节**。具体来说，元旦节是在1月1日放假，与周末连休；春节是从2月10日至17日放假调休，共8天，2月4日和2月18日上班；清明节是从4月4日至6日放假调休，共3天，4月7日上班；劳动节是从5月1日至5日放假调休，共5天，4月28日和5月11日上班；端午节是从6月10日放假，与周末连休；中秋节是从9月15日至17日放假调休，共3天，9月14日上班。以上信息仅供参考，实际放假时间可能会根据具体情况有所调整^[1]^。"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tools_info: {'name': 'baidu_search', 'rewrite_query': '2024法定假日列表？', 'baidu_search': [{'index': 1, 'url': 'http://m.gy.bendibao.com/news/68899.shtm', 'title': '2024年法定节假日放假时间完整表(全年)- 贵阳本地宝'}]}\n"
     ]
    }
   ],
   "source": [
    "#-# cell_skip\n",
    "from IPython.display import Markdown, display\n",
    "from qianfan import ChatCompletion\n",
    "\n",
    "chat_comp = ChatCompletion()\n",
    "tools = [\n",
    "    {\n",
    "        \"type\": \"tool\",\n",
    "        \"tool\": {\n",
    "            \"name\": \"baidu_search\",\n",
    "            \"baidu_search\": {\n",
    "                \"top_n\": 1\n",
    "            }\n",
    "        }\n",
    "    }\n",
    "]\n",
    "\n",
    "from qianfan import QfMessages\n",
    "msgs = QfMessages()\n",
    "msgs.append(\"2024法定假日列表？\", \"user\")\n",
    "\n",
    "resp = chat_comp.do(msgs, tools=tools, tool_choice={\n",
    "    \"type\": \"tool\",\n",
    "    \"tool\": {\n",
    "        \"name\": \"baidu_search\"\n",
    "    }\n",
    "})\n",
    "\n",
    "display(Markdown(resp[\"result\"]))\n",
    "print(\"tools_info:\", resp[\"tools_info\"])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  },
  "vscode": {
   "interpreter": {
    "hash": "58f7cb64c3a06383b7f18d2a11305edccbad427293a2b4afa7abe8bfc810d4bb"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
